package com.hua.util;

import android.content.Context;
import android.content.SharedPreferences;

import androidx.annotation.NonNull;

/**
 * 类名：CommSpUtil
 * 创建人：蒋剑华
 * 创建时间：2025/11/7 9:36
 * 类描述：SP文件存储数据的工具类
 */
public class CommSpUtil {
    //文件名字
    private static final String DEFAULT_SP_NAME = "hua_file";
    private volatile static CommSpUtil commSpUtil = null;

    //SP对象类
    private SharedPreferences sp;

    //SP操作类
    private SharedPreferences.Editor editor;


    /**
     * 方法名：getInstance
     * 作者：蒋剑华
     * 创建时间：2025/11/7 9:56
     * 参数描述：无
     * 方法描述：静态调用 懒汉式单例模式
     * 返回类型：返回this
     */
    public static CommSpUtil getInstance() {
        if (commSpUtil == null) {
            synchronized (CommSpUtil.class) {
                if (commSpUtil == null) {
                    commSpUtil = new CommSpUtil();
                }
            }
        }
        return commSpUtil;
    }

    /**
     * 方法名：initSp
     * 作者：蒋剑华
     * 创建时间：2025/11/7 9:54
     * 参数描述：@context Context类型 传入一个上下文
     * 方法描述：初始化SP文件存储类对象，在Application中调用注册
     * 返回类型：void 这个是注册方法，无返回对象
     */
    private void initSp(Context context) {
        sp = context.getSharedPreferences(DEFAULT_SP_NAME, Context.MODE_PRIVATE);
        editor = sp.edit();
    }

    /**
     * 方法名：putString  异步保存
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:02
     * 参数描述：
     *
     * @param key   String类型 作为键值对存储中的key
     * @param value String类型 作为键值对存储中的value，也就是内容
     *              方法描述：往sp文件中写入一个键值对内容进去，值为String类型
     *              返回类型：void 写入方法无需返回值，无返回值
     */
    public void putString(@NonNull String key, @NonNull String value) {
        editor.putString(key, value).apply();
    }

    /**
     * 方法名：putInt 异步保存
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:09
     * 参数描述：
     *
     * @param key   String类型 作为键值对存储中的key
     * @param value String类型 作为键值对存储中的value，也就是内容
     *              方法描述：往sp文件中写入一个键值对内容进去，值为Integer类型
     *              返回类型：void 写入方法无需返回值，无返回值
     */
    public void putInt(@NonNull String key, @NonNull Integer value) {
        editor.putInt(key, value).apply();
    }

    /**
     * 方法名：putBoolean 异步保存
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:09
     * 参数描述：
     *
     * @param key   String类型 作为键值对存储中的key
     * @param value String类型 作为键值对存储中的value，也就是内容
     *              方法描述：往sp文件中写入一个键值对内容进去，值为Boolean类型
     *              返回类型：void 写入方法无需返回值，无返回值
     */
    public void putBoolean(@NonNull String key, @NonNull Boolean value) {
        editor.putBoolean(key, value).apply();
    }

    /**
     * 方法名：putFloat 异步保存
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:09
     * 参数描述：
     *
     * @param key   String类型 作为键值对存储中的key
     * @param value String类型 作为键值对存储中的value，也就是内容
     *              方法描述：往sp文件中写入一个键值对内容进去，值为Float类型
     *              返回类型：void 写入方法无需返回值，无返回值
     */
    public void putFloat(@NonNull String key, @NonNull Float value) {
        editor.putFloat(key, value).apply();
    }

    /**
     * 方法名：putLong 异步保存
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:09
     * 参数描述：
     *
     * @param key   String类型 作为键值对存储中的key
     * @param value String类型 作为键值对存储中的value，也就是内容
     *              方法描述：往sp文件中写入一个键值对内容进去，值为Long类型
     *              返回类型：void 写入方法无需返回值，无返回值
     */
    public void putLong(@NonNull String key, @NonNull Long value) {
        editor.putLong(key, value).apply();
    }

    /**
     * 方法名：getString
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:15
     * 参数描述：
     *
     * @param key   String类型 SP中对应的key
     * @param value String类型 SP查找不到默认返回的值
     *              方法描述：读取对应key的值
     *              返回类型：返回String类型
     */
    public String getString(@NonNull String key, @NonNull String value) {
        return sp.getString(key, value);
    }

    /**
     * 方法名：getInt
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:15
     * 参数描述：
     *
     * @param key   String类型 SP中对应的key
     * @param value Integer类型 SP查找不到默认返回的值
     *              方法描述：读取对应key的值
     *              返回类型：返回Integer类型
     */
    public Integer getInt(@NonNull String key, @NonNull Integer value) {
        return sp.getInt(key, value);
    }

    /**
     * 方法名：getBoolean
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:15
     * 参数描述：
     *
     * @param key   String类型 SP中对应的key
     * @param value Boolean类型 SP查找不到默认返回的值
     *              方法描述：读取对应key的值
     *              返回类型：返回Boolean类型
     */
    public Boolean getBoolean(@NonNull String key, @NonNull Boolean value) {
        return sp.getBoolean(key, value);
    }

    /**
     * 方法名：getLong
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:15
     * 参数描述：
     *
     * @param key   String类型 SP中对应的key
     * @param value Long类型 SP查找不到默认返回的值
     *              方法描述：读取对应key的值
     *              返回类型：返回Long类型
     */
    public Long getLong(@NonNull String key, @NonNull Long value) {
        return sp.getLong(key, value);
    }

    /**
     * 方法名：getFloat
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:15
     * 参数描述：
     *
     * @param key   String类型 SP中对应的key
     * @param value Float类型 SP查找不到默认返回的值
     *              方法描述：读取对应key的值
     *              返回类型：返回Float类型
     */
    public Float getFloat(@NonNull String key, @NonNull Float value) {
        return sp.getFloat(key, value);
    }

    /**
     * 方法名：clear
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:21
     * 参数描述：无参数
     * 方法描述：删除sp文件中的所有的数据
     * 返回类型：void 删除是无返回的
     */
    public void clearAll() {
        editor.clear().apply();
    }

    /**
     * 方法名：clearByKey
     * 作者：蒋剑华
     * 创建时间：2025/11/7 11:32
     * 参数描述：@param key String类型，要删除的value对应的key
     * 方法描述：通过key删除对应的键值对
     * 返回类型：void 无返回类型
     */
    public void clearByKey(@NonNull String key) {
        editor.remove(key);
    }

    /**
     * 方法名：contains
     * 作者：蒋剑华
     * 创建时间：2025/11/7 10:22
     * 参数描述：
     *
     * @param key sp中键值对中的key
     *            方法描述：通过key查找文件中是否有这个key
     *            返回类型：true：有  false：没有
     */
    public boolean contains(@NonNull String key) {
        return sp.contains(key);
    }


}
